package org.groupg.project.configmanager.ui;

import org.groupg.project.configmanager.model.ApiConfig;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * API配置对话框 - 用于添加和编辑API配置
 */
public class ApiConfigDialog extends JDialog {
    private ApiConfig config;
    private boolean saved = false;

    // 表单字段
    private JTextField nameField;
    private JTextField baseUrlField;
    private JComboBox<String> authTypeComboBox;
    private JTextField authTokenField;
    private JTextField timeoutField;
    private JTextArea headersArea;

    // 按钮
    private JButton saveButton;
    private JButton cancelButton;
    private JButton testButton;

    /**
     * 构造函数
     * @param owner 父窗口
     * @param config API配置对象，如果为null则创建新配置
     */
    public ApiConfigDialog(Frame owner, ApiConfig config) {
        super(owner, config == null ? "添加API配置" : "编辑API配置", true);
        this.config = config != null ? config : new ApiConfig();
        initializeUI();
        populateFields();
    }

    /**
     * 初始化用户界面
     */
    private void initializeUI() {
        setLayout(new BorderLayout(10, 10));
        setSize(600, 500);
        setLocationRelativeTo(getOwner());
        setResizable(true);

        // 创建主面板
        JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
        mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

        // 表单面板
        JPanel formPanel = new JPanel(new GridLayout(6, 2, 5, 10));

        // 名称字段
        formPanel.add(new JLabel("名称*:"));
        nameField = new JTextField();
        formPanel.add(nameField);

        // 基础URL字段
        formPanel.add(new JLabel("基础URL*:"));
        baseUrlField = new JTextField();
        formPanel.add(baseUrlField);

        // 认证类型
        formPanel.add(new JLabel("认证类型:"));
        String[] authTypes = {"无认证", "Bearer Token", "API Key", "Basic Auth", "OAuth 2.0"};
        authTypeComboBox = new JComboBox<>(authTypes);
        formPanel.add(authTypeComboBox);

        // 认证令牌
        formPanel.add(new JLabel("认证令牌:"));
        authTokenField = new JTextField();
        formPanel.add(authTokenField);

        // 超时时间
        formPanel.add(new JLabel("超时时间(ms):"));
        timeoutField = new JTextField("30000");
        formPanel.add(timeoutField);

        // 请求头
        formPanel.add(new JLabel("请求头(JSON):"));
        headersArea = new JTextArea(4, 20);
        headersArea.setLineWrap(true);
        headersArea.setWrapStyleWord(true);
        JScrollPane headersScrollPane = new JScrollPane(headersArea);
        formPanel.add(headersScrollPane);

        // 添加表单面板到主面板
        mainPanel.add(formPanel, BorderLayout.CENTER);

        // 按钮面板
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        testButton = new JButton("测试连接");
        saveButton = new JButton("保存");
        cancelButton = new JButton("取消");

        // 设置按钮快捷键
        saveButton.setMnemonic('S');
        cancelButton.setMnemonic('C');
        testButton.setMnemonic('T');

        buttonPanel.add(testButton);
        buttonPanel.add(Box.createHorizontalStrut(10));
        buttonPanel.add(saveButton);
        buttonPanel.add(cancelButton);

        mainPanel.add(buttonPanel, BorderLayout.SOUTH);

        add(mainPanel, BorderLayout.CENTER);

        // 添加事件监听器
        setupEventListeners();

        // 设置默认按钮
        getRootPane().setDefaultButton(saveButton);
    }

    /**
     * 设置事件监听器
     */
    private void setupEventListeners() {
        saveButton.addActionListener(e -> saveConfig());
        cancelButton.addActionListener(e -> dispose());
        testButton.addActionListener(e -> testConnection());

        // 认证类型改变时更新界面
        authTypeComboBox.addActionListener(e -> updateAuthFieldsVisibility());
    }

    /**
     * 根据认证类型更新认证字段的可见性
     */
    private void updateAuthFieldsVisibility() {
        String authType = (String) authTypeComboBox.getSelectedItem();
        boolean authFieldsVisible = !"无认证".equals(authType);

        // 这里可以添加逻辑来控制认证相关字段的可见性
        // 在实际实现中，您可能需要调整布局来隐藏/显示相关字段
    }

    /**
     * 用配置数据填充表单字段
     */
    private void populateFields() {
        if (config.getId() != null) {
            nameField.setText(config.getName() != null ? config.getName() : "");
            baseUrlField.setText(config.getBaseUrl() != null ? config.getBaseUrl() : "");

            // 设置认证类型
            if (config.getAuthType() != null) {
                authTypeComboBox.setSelectedItem(config.getAuthType());
            } else {
                authTypeComboBox.setSelectedItem("无认证");
            }

            authTokenField.setText(config.getAuthToken() != null ? config.getAuthToken() : "");

            if (config.getTimeout() != null) {
                timeoutField.setText(config.getTimeout().toString());
            }

            headersArea.setText(config.getHeaders() != null ? config.getHeaders() : "");
        }

        // 初始更新认证字段可见性
        updateAuthFieldsVisibility();
    }

    /**
     * 保存配置
     */
    private void saveConfig() {
        // 验证必填字段
        if (nameField.getText().trim().isEmpty()) {
            JOptionPane.showMessageDialog(this, "请输入配置名称", "错误", JOptionPane.ERROR_MESSAGE);
            nameField.requestFocus();
            return;
        }

        if (baseUrlField.getText().trim().isEmpty()) {
            JOptionPane.showMessageDialog(this, "请输入基础URL", "错误", JOptionPane.ERROR_MESSAGE);
            baseUrlField.requestFocus();
            return;
        }

        // 验证URL格式
        String url = baseUrlField.getText().trim();
        if (!url.startsWith("http://") && !url.startsWith("https://")) {
            JOptionPane.showMessageDialog(this, "URL必须以http://或https://开头", "错误", JOptionPane.ERROR_MESSAGE);
            baseUrlField.requestFocus();
            return;
        }

        // 验证超时时间
        try {
            int timeout = Integer.parseInt(timeoutField.getText().trim());
            if (timeout <= 0) {
                JOptionPane.showMessageDialog(this, "超时时间必须大于0", "错误", JOptionPane.ERROR_MESSAGE);
                timeoutField.requestFocus();
                return;
            }
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, "超时时间必须是有效的数字", "错误", JOptionPane.ERROR_MESSAGE);
            timeoutField.requestFocus();
            return;
        }

        // 验证请求头JSON格式（如果提供了请求头）
        String headers = headersArea.getText().trim();
        if (!headers.isEmpty()) {
            // 这里可以添加简单的JSON格式验证
            // 实际实现中可以使用JSON库进行验证
        }

        // 更新配置对象
        config.setName(nameField.getText().trim());
        config.setBaseUrl(baseUrlField.getText().trim());
        config.setAuthType((String) authTypeComboBox.getSelectedItem());
        config.setAuthToken(authTokenField.getText().trim());

        try {
            config.setTimeout(Integer.parseInt(timeoutField.getText().trim()));
        } catch (NumberFormatException e) {
            config.setTimeout(30000); // 默认值
        }

        config.setHeaders(headersArea.getText().trim());

        // 标记为已保存并关闭对话框
        saved = true;
        dispose();
    }

    /**
     * 测试API连接
     */
    private void testConnection() {
        // 基本验证
        if (baseUrlField.getText().trim().isEmpty()) {
            JOptionPane.showMessageDialog(this, "请输入基础URL", "错误", JOptionPane.ERROR_MESSAGE);
            baseUrlField.requestFocus();
            return;
        }

        // 显示测试信息
        String authType = (String) authTypeComboBox.getSelectedItem();
        String testInfo = String.format(
            "API连接测试信息:\n\n" +
            "URL: %s\n" +
            "认证类型: %s\n" +
            "超时时间: %s ms\n\n" +
            "注意: 实际连接测试功能需要集成HTTP客户端库",
            baseUrlField.getText().trim(),
            authType,
            timeoutField.getText().trim()
        );

        JOptionPane.showMessageDialog(this, testInfo, "API连接测试", JOptionPane.INFORMATION_MESSAGE);
    }

    /**
     * 检查配置是否已保存
     * @return 如果已保存返回true，否则返回false
     */
    public boolean isSaved() {
        return saved;
    }

    /**
     * 获取配置对象
     * @return 配置对象
     */
    public ApiConfig getConfig() {
        return config;
    }
}